/EDUC-8 Octal Display Program by Steven S. Pietrobon 2 Dec 2007
/
/This program allows you to enter and examine programs using the EDUC-8 Keypad
/and Octal Display. Set the Octal Display to 737. All program data is entered
/in 737 format, from left to right. The Keypad is connected to ID0 and the
/Octal Display to OD0.
/Data Inputs: 0 to 7 for left and right digits. 0 to 3 for middile digit.
/Commands:
/ Enter  Deposit
/ +      Load Address
/ -      Clear display
/ x      Examine
/
/The program uses 7 pages (111 words) and is programmed from address 420. 
/Execution is from address 425. The Octal Display shows the data. The 
/accumulator (AC) shows the address the data will be entered into. The address 
/automatically increments when data is deposited or examined. After a program
/has been entered, halt the current program, load the address for the new 
/program, and then run the new program.

TEMP,       VAR
DISPLAY,    VAR
CHAR,       VAR
ADDRESS,    VAR

THREE,      +3
MINUS2,     -2
MINUS3,     -3
DEPOSITN,   -234
CLEAR0,     #730
CLEAR1,     #707
CLEAR2,     #037
LA,         #713
EXAM,       #714
CLEAR,      #715

/9
START,      CLA              /AC := 0
ADDRESSI,   DCA ADDRESS      /ADDRESS := AC
TEMPI,      DCA TEMP         /TEMP := 0, AC := 0
DISPLAYI,   DCA DISPLAY      /DISPLAY := AC
CHARI,      TAD MINUS3
            DCA CHAR         /CHAR := -3
            TAD TEMP         /AC := TEMP
OUTPUT,     TAD DISPLAY      /AC := AC+DISPLAY
OUTPUTI,    DCA DISPLAY      /DISPLAY := AC
            TAD DISPLAY
            LDS 0            /write(DISPLAY)
/10
DISPLAYAD,  TAD ADDRESS      /AC := ADDRESS
READ,       SKF 0            /if FLAG = 0
            JMP READ         /then READ else
            KRB 0
            DCA TEMP         /read(TEMP)
            TAD TEMP
            AND CLEAR0
            SZA              /if (TEMP and CLEAR0) <> 0
            JMP NOTNUM       /then NOTNUM else
            ISZ CHAR         /CHAR := CHAR+1, if CHAR <> 0
/11
            JMP FIRSTORSCD   /then FIRSTORSCD else
THIRD,      TAD DISPLAY
            AND CLEAR0       /AC := DISPLAY and CLEAR0
            JMP DISPLAYI

FIRSTORSCD, CLA.IAC
            AND CHAR
            SZA              /if (CHAR mod 2) = 1
            JMP SECOND       /then SECOND else
FIRST,      TAD DISPLAY
            AND CLEAR2
/12
            DCA DISPLAY      /DISPLAY := DISPLAY and CLEAR2
            TAD TEMP
            RAR
            RAR
            RAR              /AC := 32*TEMP
            JMP OUTPUT

SECOND,     CLA
            TAD DISPLAY
            AND CLEAR1
            DCA DISPLAY      /DISPLAY := DISPLAY and CLEAR1
            TAD THREE
/13
            AND TEMP
            RAL
            RAL
            RAL              /AC := 8*(TEMP mod 4)
            JMP OUTPUT

NOTNUM,     CLA
            TAD TEMP
            TAD DEPOSITN     /AC := TEMP-DEPOSIT
            SZA              /if AC <> 0
            JMP EXAMTEST     /then EXAMTEST else
DEPOSIT,    TAD DISPLAY
/14
            DCA I ADDRESS    /R[ADDRESS] := DISPLAY
            INC ADDRESS      /ADDRESS := ADDRESS+1
            DCA TEMP         /TEMP := 0; AC := 0
            JMP CHARI

EXAMTEST,   TAD MINUS2       /DEPOSIT-EXAM = -2
            SZA              /if AC <> 0
            JMP LATEST       /then LATEST else
EXAM,       TAD I ADDRESS    /AC := R[ADDRESS]
            INC ADDRESS      /ADDRESS := ADDRESS+1
            JMP OUTPUTI
LATEST,     IAC              /EXAM-LA = 1
/15
            SZA              /if AC <> 0
            JMP CLEARTEST    /then CLEARTEST else
LA,         TAD DISPLAY      /AC := DISPLAY
            JMP ADDRESSI

CLEARTEST,  TAD MINUS2       /LA-CLEAR = -2
            SZA              /if AC <> 0 
            JMP BADINPUT     /then BADINPUT else
CLEAR,      JMP TEMPI

BADINPUT,   CLA              /AC := 0
            JMP DISPLAYAD